// #ifndef MP
import TIM from 'tim-js-sdk'
// #endif
// #ifdef MP
import TIM from 'tim-wx-sdk'
// #endif
// 发送图片、文件等消息需要腾讯云即时通信IM上传插件
import TIMUploadPlugin from 'tim-upload-plugin'

const install = (app) => {
	const EVENT = {
		state: uni.$store[uni.$store.main.idtype],
		// 接收消息
		MESSAGE_RECEIVED(e){
			EVENT.state.msgs = EVENT.state.msgs.concat(e.data)
		},
		// 消息已读
		MESSAGE_READ_BY_PEER(e){
			e.data.map(r=>{
				const item = EVENT.state.msgs.find(msg=>r.ID==msg.ID)
				item && (item.isPeerRead = r.isPeerRead)
			})
		},
		// 更新会话
		CONVERSATION_LIST_UPDATED(e){
			if(e.data.length==0){
				return
			}
			const data = {}
			e.data.map(r=>data[r.conversationID]=r)
			// const convs = EVENT.state.convs
			EVENT.state.convs.map((i,r)=>{
				if(r && data[r.conversationID]){
					EVENT.state.convs[i]=r
				} else {
					EVENT.state.convs.unshift(r)
				}
			})
		},
		SDK_READY(e){
			tim.getConversationList().then(({code, data})=>{
				EVENT.state.convs = data.conversationList
				EVENT.state.unreadCount = 0
				data.conversationList.map(r=>{
					EVENT.state.unreadCount += r.unreadCount
				})
			})
		},
		MESSAGE_REVOKED(e){},
		GROUP_LIST_UPDATED(e){},
		PROFILE_UPDATED(e){},
		BLACKLIST_UPDATED(e){},
		ERROR(e){
		},
		// 退出登录是调用
		SDK_NOT_READY(e){
		},
		KICKED_OUT(e){},
		NET_STATE_CHANGE(e){}
	}

	// 创建 SDK 实例，TIM.create() 方法对于同一个 SDKAppID 只会返回同一份实例
	const tim = TIM.create({
		SDKAppID: 1400510600 // 接入时需要将0替换为您的即时通信 IM 应用的 SDKAppID
	}); // SDK 实例通常用 tim 表示
	// 设置 SDK 日志输出级别，详细分级请参见 setLogLevel 接口的说明
	tim.setLogLevel(1); // 普通级别，日志量较多，接入时建议使用
	// tim.setLogLevel(1); // release 级别，SDK 输出关键信息，生产环境时建议使用

	// 注册腾讯云即时通信IM上传插件
	tim.registerPlugin({'tim-upload-plugin': TIMUploadPlugin});
	// 监听事件，例如：
	// 收到离线消息和会话列表同步完毕通知，接入侧可以调用 sendMessage 等需要鉴权的接口
	// event.name - TIM.EVENT.SDK_READY
	tim.on(TIM.EVENT.SDK_READY, EVENT.SDK_READY);
	// 收到推送的单聊、群聊、群提示、群系统通知的新消息，可通过遍历 event.data 获取消息列表数据并渲染到页面
	// event.name - TIM.EVENT.MESSAGE_RECEIVED
	// event.data - 存储 Message 对象的数组 - [Message]
	tim.on(TIM.EVENT.MESSAGE_RECEIVED, EVENT.MESSAGE_RECEIVED);
	tim.on(TIM.EVENT.MESSAGE_REVOKED, EVENT.MESSAGE_REVOKED);
	tim.on(TIM.EVENT.MESSAGE_READ_BY_PEER, EVENT.MESSAGE_READ_BY_PEER);
	tim.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, EVENT.CONVERSATION_LIST_UPDATED);
	tim.on(TIM.EVENT.GROUP_LIST_UPDATED, EVENT.GROUP_LIST_UPDATED);
	tim.on(TIM.EVENT.PROFILE_UPDATED, EVENT.PROFILE_UPDATED);
	tim.on(TIM.EVENT.BLACKLIST_UPDATED, EVENT.BLACKLIST_UPDATED);
	// 收到 SDK 发生错误通知，可以获取错误码和错误信息
	// event.name - TIM.EVENT.ERROR
	// event.data.code - 错误码
	// event.data.message - 错误信息
	tim.on(TIM.EVENT.ERROR, EVENT.ERROR);
	// 收到 SDK 进入 not ready 状态通知，此时 SDK 无法正常工作
	// event.name - TIM.EVENT.SDK_NOT_READY
	tim.on(TIM.EVENT.SDK_NOT_READY, EVENT.SDK_NOT_READY);
	// 收到被踢下线通知
	// event.name - TIM.EVENT.KICKED_OUT
	// event.data.type - 被踢下线的原因，例如:
	//    - TIM.TYPES.KICKED_OUT_MULT_ACCOUNT 多实例登录被踢
	//    - TIM.TYPES.KICKED_OUT_MULT_DEVICE 多终端登录被踢
	//    - TIM.TYPES.KICKED_OUT_USERSIG_EXPIRED 签名过期被踢 （v2.4.0起支持）。 
	tim.on(TIM.EVENT.KICKED_OUT, EVENT.KICKED_OUT);
	//  网络状态发生改变（v2.5.0 起支持）。 
	// event.name - TIM.EVENT.NET_STATE_CHANGE 
	// event.data.state 当前网络状态，枚举值及说明如下： 
	//     \- TIM.TYPES.NET_STATE_CONNECTED - 已接入网络 
	//     \- TIM.TYPES.NET_STATE_CONNECTING - 连接中。很可能遇到网络抖动，SDK 在重试。接入侧可根据此状态提示“当前网络不稳定”或“连接中” 
	//    \- TIM.TYPES.NET_STATE_DISCONNECTED - 未接入网络。接入侧可根据此状态提示“当前网络不可用”。SDK 仍会继续重试，若用户网络恢复，SDK 会自动同步消息  
	tim.on(TIM.EVENT.NET_STATE_CHANGE, EVENT.NET_STATE_CHANGE);
	// 开始登录.log()
	uni.$tim = tim
}
export default {
	install
}
